iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Modern Web

擁抱 .Net Core系列 第 10

[Day10] 談談設定檔(組態) - Configuration - 1

  • 分享至 

  • xImage
  •  

Builder Pattern

我們前面提到了dotnet core運用了很多的Builder Pattern 來建立物件
Configuration 也是其中之一

最後我們在用的Config主要是由三個物件所組成的

  1. IConfigurationSource - 負責提供設定檔的來源
  2. IConfigurationBuilder - 負責將建置出設定
  3. IConfiguration - 我們在用的設定檔

他們之間的關係大Guy 4醬
https://ithelp.ithome.com.tw/upload/images/20220921/20109549xo4NDoPtpr.png

一個IConfigurationBuilder 可能有多組來源
最後會透過Buildy組出成一個IConfiguration
舉例而言,dotnet framework 中常用的設定檔web.config跟app.config這種xml格式的config
可以透過加一個 XmlConfigurationSource 就可以跟 dotnet core 的appsetting 一起使用

IConfiguration

IConfiguration 本身是一個樹狀的結構
以json類型的Config為例
appsettings.json

{
  "line": {
    "channelId": "line_channel_id",
    "channelSecret": "line_channel_secret",
    "info": {
      "name": "line_bot_name",
      "pictureUrl": "line_bot_picture_url"
    }
  },
  "facebook": {
    "pageId": "facebook_page_id",
    "accessToken": "facebook_page_access_token",
    "appSecret": "facebook_app_secret"
  },
  "telegram": {
    "botToken": "telegram_bot_token"
  }
}

對應的IConfiguration

結構長的會像
https://ithelp.ithome.com.tw/upload/images/20220921/20109549BuAM8OXUAN.jpg

當我們想要取 line 的 ChannelId時
可以透過 下面的方式取

IConfiguration configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var channelId = configuration["line:channelId"];

我們建立了一個ConfigurationBuilder的物件,並且透過了AddJsonFile加入了一個IConfigurationSource
最後透過Build方法取得IConfiguration

不過我想針對的重點是在line:channelId

就像上面畫的IConfiguration.cs 是個樹狀結構
我們透過這個 : 來表達階層的概念
要取得line 的 name line -> info -> name line:info:name

IConfigurationRoot

我們在上圖有看到樹的根是一個IConfigurationRoot的物件
IConfigurationRoot 本身繼承了 IConfiguration 的介面
裡面有一個比較重要的方法void Reload() 當這個方法被呼叫的時候,整棵樹會被刷新,所有tree 的資料會被刷新。

IConfigurationSection

上面圖非根的節點

IConfigurationSection.cs

public interface IConfigurationSection : IConfiguration
    {
        /// <summary>
        /// Gets the key this section occupies in its parent.
        /// </summary>
        string Key { get; }

        /// <summary>
        /// Gets the full path to this section within the <see cref="IConfiguration"/>.
        /// </summary>
        string Path { get; }

        /// <summary>
        /// Gets or sets the section value.
        /// </summary>
        string Value { get; set; }
    }
  • Key指的是當前節點的名字?(我想不到比較好的形容詞)
  • Path則是由Key 所組成的,用:分隔,代表當前節點在樹中的位置,ex info 的 Path就是 line:info
  • Value 則代表節點的值,非葉子節點(綠色的)的值預設是null,像facebook:pageId的值為facebook_page_id
    line:info 的值為null

IConfigurationRoot的Reload被呼叫時,所有IConfigurationSection的value會被重設


上一篇
[Day9] 補坑之談談 .Net core 的相依性注入實作
下一篇
[Day11] 談談設定檔(組態) - Configuration - 2
系列文
擁抱 .Net Core30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言